/*
#include <stdio.h>
/*  冒泡排序
 *
void bubble_sort(int arr[],int len){
    int temp;

    while (--len){
        for(int i = 0 ; i< len ; i++){
            if(arr[i]>arr[i+1]){
                temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
    }
}

void print(int arr[],int len){
    for(int i = 0 ; i <len;i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    int len = sizeof(arr) / sizeof(arr[0]);
    print(arr,len);
    bubble_sort(arr,len);
    print(arr,len);
    return 0;
}*/


/*
 * 模拟qsort 函数的实现
 */

//用于交换 2个值的位置的函数
// 接收的是 2个char型字符的指针，width 是 传过来的字节长度
//我们可以通过一个字节一个字节交换的形式 完成整体 交换， 所以交换的次数就是要换位置参数的字节长度width
void temp(char* c1,char* c2,int width){
    while (width--){
        char tp = *c1;
        *c1 = *c2;
        *c2 = tp;
        c1++;c2++; //第一个字节互换完后， 地址+1，进行后面的字节交换
    }
}



#include <stdio.h>
#include <string.h>

//函数的比较方式，整形数组比较
int intcmp(const void* e1,const void * e2){
    return (*(int*)e1)- (*(int*)e2);
}

//函数的比较方式，字符数组比较
int StrCmp(const void* e1,const void * e2){
    return strcmp((char*)e1,(char*)e2);   //比较两个字符大小
}


   //第一个参数是数组首元素的地址，因为不知道数组类型，所以要用 void* ，第二个为元素个数，用来确定比较的次数
//第三个参数为 元素字节大小，用于确定 数组首元素  后 的元素地址，第四个参数为一个函数指针，返回的值 正数则大于，0则等于，负数则小于
void bubble_qsort(void *base,
                  int size,
                  int width,
                  int(*cmp)(const void* e1, const void *e2)){
    while (size--){
        for(int i = 0 ; i<size ; i++){
          if(cmp((char*)base+i*width , (char*)base+(i+1)*width)>0){//把数组元素的地址传给cmp函数比较，大于0就交换位置
              temp((char*)base+i*width,(char *)base+(i+1)*width,width);//把要交换的2个元素的地址传送给交换函数，元素字节大小也传进去
          }
        }
    }


}


void PrintIntArr(int * arr,int sz,int width){
     for(int i = 0  ; i < sz ;i++){
         printf("%d ",arr[i]);
     }
}

void fun1(){
    int arr[10] = {1,5,6,3,2,4,7,8,9,0};
    int sz = sizeof (arr) / sizeof(arr[0]);
    bubble_qsort(arr,sz,sizeof (arr[0]),intcmp);
    PrintIntArr(arr,sz, sizeof(arr[0]));
    printf("\n");
}


PrintStrArr(char* arr,int len){
    for(int i = 0 ; i<len ; i++){
        printf("%c ",arr[i]);
    }
    printf("\n");
}

void fun2(){
    char arr[] = "achgbdfe";
    int size = strlen(arr);
    bubble_qsort(arr,size, sizeof(arr[0]),StrCmp);
    PrintStrArr(arr,size);
}
struct Student {
    char name[20] ;
    int age;
    float score;

};


int Structcmp(const void * e1,const void*e2){
  return  ((struct Student*)e1)->score - ((struct Student*)e2)->score;
}

void fun3(){

    struct Student str[] = {{"王炸",20,95.5},{"张三",22,90}
    ,{"王五",26,98.5}};
   int size = sizeof(str)/sizeof(str[0]);
    printf("%f  %f  %f",str[0].score,str[1].score,str[2].score);
    printf("\n");
    bubble_qsort(str,size, sizeof(str[0]),Structcmp);
    printf("%f  %f  %f",str[0].score,str[1].score,str[2].score);

}

int main(){
  ///  fun1();//整形数组排序
   // fun2(); //字符数组排序
    fun3();//结构体排序

    return 0;
}